/**
 *  泛型工具类型: TS内置了一些常用的工具类型,来简化TS中的一些常见操作
 *  说明:他们都是基于泛型实现的(泛型适用于多种类型,更加通用),并且是内置的,可以直接在代码中使用。
 * 
 *  1.Partial<Type>
 *  2.Readonly<Type>
 *  3.Pick<Type, Keys>
 *  4.Reord<Keys, Type>
 */



//1.Partial<Type>用来构造(创造)一个类型,将Type的所有属性设置为可选
//构造出来的新类型PartialProps结构和Props相同,但所有属性都变为可选的

interface Props {
    id: string
    children: number[]
}

type PartialProps = Partial<Props>

let p1:Props = {
    //id,children必选,必须提供
    id: '1',
    children: [1]
}

let p2:PartialProps = {
    //id,children可选,也可以都不写
}








//2.泛型工具类型-Readonly<Type>用来构造一个类型,将Type的所有属性都设置为readonly(只读)
//构造出来的新类型ReadonlyProps和Props结构相同,但所有属性都变为只读的。
//当我们想重新给id属性赋值时,就会报错,无法分配到id,因为它是只读属性

type ReadonlyProps = Readonly<Props>
let p3: ReadonlyProps = {
    id: '1',
    children: [1]
}
// p3.id = 3 //无法修改







//3.泛型工具类型 Pick<Type,Keys> 从Type中选择一组属性来构造新类型

interface Props1 {
    id: number,
    title: string
    children: number[]
}

type PickProps = Pick<Props1, 'id' | 'title'>
let p4:PickProps = {
    id: 1,
    title: 'tom'
}


// 1.Pick工具类型有两个类型变量: 1.表示选择谁的属性 2.表示选择哪几个属性
// 2.其中第二个类型变量,如果只选择一个,则只传入该属性名即可
// 3.第二个类型变量传入的属性只能是第一个类型变量中存在的属性
// 4.构造出来的新类型PickProps,只有id和title2个属性








//4.泛型工具类型 Record<Keys,Type>构造一个对象类型,属性键为Keys,属性类型为Type

// type RecordObj = {
//     a:string,
//     b:string,
//     c:string
// }

type RecordObj = Record<'a'|'b'|'c', string>

let obj: RecordObj = {
    a: 'tom',
    b: 'tom',
    c: 'tom',
}


//1.Record工具类型有2个类型变量, 1.表示对象有哪些属性, 2.表示对象属性的类型
//2.构建的新对象类型RecordObj表示: 这个对象有3个属性分别为 a/b/c, 属性值的类型都为string








